/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function (nums, k) {
  //结果数组
  let result = []
  //单调递减栈
  let deque = []

  for (let i = 0; i < nums.length; i++) {
    // 移除队尾比当前元素小的值（队列保持单调递减）
    while (deque.length !== 0 && nums[deque[deque.length - 1]] <= nums[i]) {
      deque.pop()
    }
    deque.push(i)//压入当前索引

    //如果队首元素超出滑动窗口的左边界，移除该元素
    if (deque[0] <= i - k) {
      deque.shift()
    }

    //当i大于等于k-1时才能开始收集滑动窗口最大值
    if (i >= k - 1) {
      result.push(nums[deque[0]])
    }
  }

  //返回结果数组
  return result
};